package cn.jsj.education.file.management;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

/**
 * 文件管理模块
 *
 * @author 卢斌
 */
@Validated
public interface FileService {

    /**
     * 保存MultipartFile对象到文件服务模块，返回文件唯一标识
     *
     * @param multipartFile 文件对象
     * @return  文件唯一标识
     */
    String saveMultiPartFile(@NotNull MultipartFile multipartFile);


    /**
     * 保存服务器本地路径文件到文件服务模块，返回文件唯一标识
     *
     * @param locationFilePath  服务器本地路径
     * @return  文件唯一标识
     */
    String saveLocationFile(@NotNull File locationFilePath);


    /**
     * 通过文件唯一标识获取文件流
     *
     * @param primaryKey    文件唯一标识
     * @return  fileStream
     */
    BufferedInputStream readFileStream(@NotBlank String primaryKey);


    /**
     * 检查文件是否存在
     *
     * @param primaryKey    文件唯一标识
     * @return  true 存在
     */
    boolean existFile(@NotBlank String primaryKey);


    /**
     * 获取文件服务模块中某一文件的类型，并返回大写后缀名。如果文件不存在则返回null
     *
     * @param primaryKey    文件唯一标识
     * @return  文件大写后缀名
     */
    String getFileSuffixName(@NotBlank String primaryKey);


    /**
     * 获取文件类型，并返回大写后缀名。
     *
     * @param multipartFile 文件实体
     * @return  文件后缀名
     */
    String getFileSuffixNameInMultipart(@NotNull MultipartFile multipartFile);


    /**
     * 文件系统是否支持该文件类型
     *
     * @param fileSuffix    文件后缀名
     * @return  是否支持
     */
    boolean checkFileTypeIsSupported(@NotBlank String fileSuffix);


}
